package com.tools.web.swagger;

import com.tools.common.object.Note;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.OpenAPI;

import java.util.Objects;

/**
 * Swagger API 文档的 Docket 对象包装
 * */
@Note("Swagger API 文档的 Docket 对象包装")
public class SwaggerDocket {

    @Note("是否启用，默认是 true。这个的优先级比配置文件的要低")
    private boolean enable;

    @Note("API 文档的基础元数据")
    private SwaggerAPI swaggerAPI;

    /* ***********************************************************************************
     *
     *         构造器
     *
     * **********************************************************************************
     * */

    public SwaggerDocket(SwaggerAPI swaggerAPI) {
        this.setSwaggerAPI(swaggerAPI);
        this.setEnable(true);
    }

    public static SwaggerDocket of(SwaggerAPI swaggerAPI) {
        return new SwaggerDocket(swaggerAPI);
    }


    /* ***********************************************************************************
     *
     *         Getter / Setter
     *
     * **********************************************************************************
     * */

    public boolean isEnable() {
        return enable;
    }

    public void setEnable(boolean enable) {
        this.enable = enable;
    }

    public SwaggerAPI getSwaggerAPI() {
        return swaggerAPI;
    }

    public void setSwaggerAPI(SwaggerAPI swaggerAPI) {
        if(swaggerAPI != null) {
            this.swaggerAPI = swaggerAPI;
            return;
        }
        throw new NullPointerException("SwaggerAPI 不能为 null");
    }

    @Override
    public String toString() {
        return "SwaggerDocket{" +
                ", enable=" + enable +
                ", swaggerAPI=" + swaggerAPI +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SwaggerDocket that = (SwaggerDocket) o;
        return Objects.equals(swaggerAPI, that.swaggerAPI);
    }

    @Override
    public int hashCode() {
        return Objects.hash(swaggerAPI);
    }

    /* ***********************************************************************************
     *
     *         链式调用
     *
     * **********************************************************************************
     * */

    public SwaggerDocket enable(boolean enable) {
        this.setEnable(enable);
        return this;
    }

    public SwaggerDocket swaggerAPI(SwaggerAPI swaggerAPI) {
        this.setSwaggerAPI(swaggerAPI);
        return this;
    }

    /* ***********************************************************************************
     *
     *         功能方法
     *
     * **********************************************************************************
     * */

    public OpenAPI toOpenAPI() {
        Info apiInfo = this.swaggerAPI.toApiInfo();
        return new OpenAPI().info(apiInfo);
    }

}
